package principal;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.border.EmptyBorder;

import javacc.Gramatica;
import javacc.ParseException;
import util.Mensagem;
import util.TextLineNumber;

public class Compilador extends JFrame {

	/**
	 *  @author WRP
	 */
	
	private static final long serialVersionUID = 1L;
	private JPanel contentPane;
	
	protected JTextArea jtCodigoFonte 			= new JTextArea();
	protected JTextArea jtLog         			= new JTextArea();
	protected ControleArquivo controleArquivo 	= new ControleArquivo();
	private   Gramatica    gramatica;
	private   FileInputStream arquivo; 
	
	public static void main(String[] args)throws ParseException {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Compilador frame = new Compilador();
					frame.setVisible(true);
					frame.setLocationRelativeTo(null);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	
	public Compilador() {
		setTitle("Compilador WRP ++");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 900, 700);
		
		JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);
		
		JMenu jMenu = new JMenu("File");
		menuBar.add(jMenu);
		
		JMenuItem mntmNew = new JMenuItem("New");
		mntmNew.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				controleArquivo = new ControleArquivo();
				jtCodigoFonte.setText("");
				jtLog.setText("");
			}
		});
		jMenu.add(mntmNew);
		
		JMenuItem mntmAbrir = new JMenuItem("Open");
		mntmAbrir.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				 jtCodigoFonte.setText(controleArquivo.abrir(contentPane)); 
			}
		});
		jMenu.add(mntmAbrir);
		
		JMenuItem mntmSalvar = new JMenuItem("Save");
		mntmSalvar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				 controleArquivo.save(contentPane,jtCodigoFonte.getText());
			}
		});
		
		jMenu.add(mntmSalvar);
		
		JMenuItem mntmAbrirAs = new JMenuItem("Save As");
		mntmAbrirAs.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				 controleArquivo.saveAs(contentPane,jtCodigoFonte.getText());
			}
		});
		jMenu.add(mntmAbrirAs);
		
		JMenuItem mntmCompilar = new JMenuItem("Run");
		mntmCompilar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				if(jtCodigoFonte.getText().trim().length() == 0){
					Mensagem.aviso("Crie o codigo fonte antes de compilar!");
					return;
				}
				
				controleArquivo = new ControleArquivo();
				controleArquivo.SalvarArquivo(jtCodigoFonte.getText());
				
				
				try {
					arquivo         = new FileInputStream("./arquivos/fonte.txt");	
				} catch (FileNotFoundException e1) {
					e1.printStackTrace();
				}
				
				try {
					gramatica       = new Gramatica(arquivo);
					gramatica.algoritmo();
					
					jtLog.setText("Copilado com sucesso!");
				} catch (ParseException erro) {
					jtLog.setText(erro.getMessage());
				}
				
			}
		});
		
		menuBar.add(mntmCompilar);
		
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		// INSTACIA OS SCROLLPANE
		JScrollPane jsCodigoFonte = new JScrollPane();
		jsCodigoFonte.setViewportView(jtCodigoFonte);
		jsCodigoFonte.setBounds(10, 11, 863, 460);
		contentPane.add(jsCodigoFonte);
		
		TextLineNumber textLine = new TextLineNumber(jtCodigoFonte);
		jsCodigoFonte.setRowHeaderView(textLine );
	    contentPane.add(jsCodigoFonte);
		
		JScrollPane jsLog = new JScrollPane();
		jtLog.setForeground(Color.RED);
		jtLog.setEditable(false);
		jsLog.setViewportView(jtLog);
		jsLog.setBounds(10, 480, 863, 150);
		contentPane.add(jsLog);
	}
}
